﻿#ifndef __MAILBOX_HEAD__
#define __MAILBOX_HEAD__

#include <cassert>
#include <string>

#include <boost/noncopyable.hpp>

#include "protobuf_fwd.h"  // for Message
#include "rpc/rpc_callback.h"  // for RpcCallback
#include "rpc/rpc_data_vector.h"  // for RpcDataVector

// Mail box is used to send messages.
// 可看成待发送队列。
// 延续旧代码中的Mb概念，新代码中应该尽量弱化Mb的概念，
// 未来可能重新命名为更确切的名字。
class CMailBox : boost::noncopyable
{
    public:
        CMailBox();
        virtual ~CMailBox();

    public:
        inline uint64_t GetId() const
        {
            return m_uId;
        }

		using Callback = RpcCallback;
		// ServerMb and ClientMb both need to request rpc.
		void PushRpcReq(const std::string& sServiceName,
			const std::string& sMethod,
			const google::protobuf::Message& request,
			const Callback& cb = Callback());
		void PushRpcReq(const std::string& sServiceName,
			const std::string& sMethod,
			const std::string& sRequest,
			const Callback& cb = Callback());

		// 清空发送队列
		void ClearSendQueue()
		{
			m_vOutgoingRpc.clear();
		}

        // 发送队列是否为空
        inline bool IsEmpty() const
        {
            return m_vOutgoingRpc.empty();
        }

		// 交出发送队列
		inline void SwapOutRpcVector(RpcDataVector& rVec)
		{
			assert(rVec.empty());
			rVec.swap(m_vOutgoingRpc);
		}

	protected:
		// 添加欲发送的消息到队列中
		void PushRpcData(const RpcDataSptr& pRpc)
		{
			assert(pRpc);
			m_vOutgoingRpc.emplace_back(pRpc);
		}

    private:
        const uint64_t    m_uId;             // MailBox的标识ID
        RpcDataVector     m_vOutgoingRpc;    // 待发送Rpc列表
};

#endif		//__MAILBOX_HEAD__

